package com.abner.myutils.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
 
/**
 * jdbc 操作的 工具类
 * 
 * @author salmon
 * 
 */
public class DBUtils {
 
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://192.168.1.250:3306/bx";
    private static final String username = "root";
    private static final String password = "qhbx_5227736";
 
    public Connection conn;
    public Statement st;
    public PreparedStatement ps;
    public ResultSet rs;
 
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 得到一个链接
     * 
     * @return
     */
    /*
     * public Connection getConnection(){ try { conn =
     * DriverManager.getConnection(url,username,password); } catch (SQLException
     * e) { e.printStackTrace(); System.out.println("得到链接 失败！"); } return conn;
     * }
     */
    private void getConnection() {
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("得到链接 失败！");
        }
    }
 
    /**
     * 得到一个 状态通道
     */
    private void getStatement() {
        this.getConnection();
        try {
            st = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("创建状态通道失败!");
        }
    }
 
    /**
     * 得到一个 预状态 通道
     * 
     * @param sql
     *            模板sql 语句 ？？？？？
     */
    private void getPreStatement(String sql) {
        this.getConnection();
        try {
            ps = conn.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("创建预备通道  失败！");
        }
    }
 
    /**
     * 基于 状态通道 执行 数据操作 insert update delete
     * 
     * @param sql
     *            inset update delete
     * @return boolean
     */
    public boolean updateData(String sql) {
        boolean isok = false;
        this.getStatement();
        int result;
        try {
            result = st.executeUpdate(sql);
            if (result > 0) {
                isok = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("在状态通道下 执行数据操作 失败！");
        }
        return isok;
    }
 
    /**
     * 在状态通道下 执行 查询
     * 
     * @param sql
     *            select * from ********************
     * @return
     */
    public ResultSet query(String sql) {
        this.getStatement();
        try {
            rs = st.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("在状态通道下执行 数据查询失败！");
            return null;
        }
        return rs;
    }
 
    /**
     * 在预备状态通道下 执行数据的 操作
     * 
     * @param sql
     *            insert update delete ？？？？？？
     * @param params　　ｌｉｓｔ
     *            问号参数
     * @return boolean
     */
    public boolean updateData(String sql, List<?> params) {
        boolean isok = false;
        this.getPreStatement(sql);
        try {
            // 绑定参数
            this.bangParams(params);
            // 执行
            int result = ps.executeUpdate();
            if (result > 0) {
                isok = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("在预备状态通道下执行数据操作失败！");
        }
        return isok;
    }
 
    private void bangParams(List<?> params) throws SQLException {
        if (params != null && !params.isEmpty()) {
            for (int i = 0; i < params.size(); i++) {
                ps.setString(i + 1, params.get(i).toString());
            }
        }
    }
    /**
     * 预备状态通道下执行 查询
     * @param sql   select * from  ***　where　？？？？
     * @param params　　　list
     * @return  resultSet
     */
    public   ResultSet   query(String sql,List<?>  params){
        this.getPreStatement(sql);
        try {
            this.bangParams(params);
            rs = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("在预备状态通道下执行 数据查询失败！");
            return null;
        }
        return rs;
    }
    /**
     * 关闭资源
     */
    public   void   closeRes(){
         try {
              if(rs != null){
                  rs.close();
              }
              if(ps != null){
                  ps.close();
              }
              if(st != null){
                  st.close();
              }
              if(conn != null){
                  conn.close();
              }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
